package com.ruoyi.oa.service;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.oa.domain.OaHumanClock;
import com.ruoyi.oa.domain.bo.AdjustClockBo;
import com.ruoyi.oa.domain.bo.ClockUserInfoBo;
import com.ruoyi.oa.domain.vo.*;
import com.ruoyi.oa.domain.bo.OaHumanClockBo;
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.core.domain.PageQuery;

import java.text.ParseException;
import java.util.Collection;
import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 * 考勤规则Service接口
 *
 * @author ruoyi
 * @date 2023-07-18
 */

public interface IOaHumanClockService {

    /**
     * 查询考勤规则
     */
    OaHumanClockVo queryById(String id);

    /**
     * 查询考勤规则列表
     */
    TableDataInfo<OaHumanClockVo> queryPageList(OaHumanClockBo bo, PageQuery pageQuery);

    /**
     * 查询考勤规则列表
     */
    List<OaHumanClockVo> queryList(OaHumanClockBo bo);


    List<OaHumanClock> getAll();

    /**
     * 新增考勤规则
     */
    Boolean insertByBo(OaHumanClockBo bo);

    /**
     * 修改考勤规则
     */
    Boolean updateByBo(OaHumanClockBo bo);

    Boolean adjustClock(AdjustClockBo bo) throws ParseException;

    public void adjustApply(OaHumanReplaceVo vo) throws ParseException;


    public R<Boolean> clock(ClockUserInfoBo bo);


    /**
     * 请假同步
     * @param vo
     */
    public void sysLeave(OaHumanLeaveVo vo);

    /**
     * 校验并批量删除考勤规则信息
     */
    Boolean deleteWithValidByIds(Collection<String> ids, Boolean isValid);

    /**
     * 获取用户补卡信息
     * @param userId
     * @param month
     * @return
     */
     JSONObject getUserReplaceInfo(String userId, String month);

    /**
     * 判断
     * @param userId
     * @param replaceDate
     * @return
     */
    public Boolean checkDateHasChance(String userId,Date replaceDate);

     void sysTrip(OaFinanceTripApplyVo vo);

    R<Boolean> getClockLocation(String userId, Date date,double longitude,double latitude);

    /**
     * 通过用户id和年月份信息获取用户当月打卡信息
     * @param yearMonth
     * @param userId
     * @return
     */
    public JSONArray getAllDatesInMonth(String yearMonth, String userId);


    /***
     * 获取所有需要打卡的人数
     * @return
     */
    public int getAllShouldClockNum();

    /**
     * 按照月份统计所有考勤正常的人数
     * @param month
     * @return
     */
    Map<String, Object> SelectNormalUserByMonth(String month);

    public String getWorkOrOffClock(Date clockDate,String userId);

    /**
     * 按照日期统计所有考勤正常的人数
     * @param date
     * @return
     */
    public Map<String, Object> SelectNormalUserByDate(String date);
}
